FHEM – extern Daten einspeisen
Seit einiger Zeit betreibe ich einen FHEM server und protokolliere Temperatur, Luftfeuchte, Stromverbrauch und steuere Funkschalter.
Nun wollte ich unsere langsame Internet-Verbindung protokollieren. Dazu habe ich ein Perl Script geschrieben:
#!/usr/bin/perl use warnings; use strict; use Net::Ping; use Time::HiRes qw(tv_interval gettimeofday); $|++; #my($host) = shift() || die("Usage: $0 <host.somewhere.com>\n"); my ($host)="8.8.8.8"; my ($count)=0; my($ping) = Net::Ping->new('icmp'); my($avg)=0; my($avgcnt)=0; while ($count<4) { my($timeStart) = [gettimeofday()]; if ($ping->ping($host, 5)) { my($timeElapsed) = tv_interval($timeStart, [gettimeofday()]); #printf("%s: %.3f msec\n", $host, $timeElapsed * 1000); #printf("%.3f ms\n", $timeElapsed * 1000); $avg+=$timeElapsed * 1000; $avgcnt++; } else { my($timeElapsed) = tv_interval($timeStart, [gettimeofday()]); #printf("%s failed: %.3f\n", $host, $timeElapsed * 1000); #printf("%s\n", "failed"); } sleep(1); $count++; } if($avgcnt!=0){ $avg=$avg/$avgcnt; } else{ $avg=0; } printf("%.3f\n", $avg); system("perl", "/opt/fhem/fhem.pl", "7072", "setreading pingtime time ".$avg); $ping->close(); exit();
Nun galt es das Script aus FHEM aufzurufen. Letztendlich scheitert dies aber daran, dass der ping Befehl root-Rechte benötigt. Die System-Zeile wurde erst später hinzugefügt. Das Script gibt einfach die mittlere Ping Zeit auf der Console (Linux Debian Jessie) aus.
Also lasse ich das Script nun von cron aus alle 5 Minuten laufen und der Perl system Befehl trägt die Daten über das fhem.pl Script direkt in den FHEM Server ein. Dazu müssen folgende Zeilen in der fhem.cfg vorhanden sein:
define pingtime dummy attr pingtime room Internet,Dachboden attr pingtime stateFormat time define pingtime_log FileLog ./log/pingtime-%Y-%m.log pingtime.* attr pingtime_log room Dachboden,Internet define SVG_pingtime_log_1 SVG pingtime_log:SVG_pingtime_log_1:CURRENT attr SVG_pingtime_log_1 room Internet
Diese Zeilen legen ein dummy Device namens pingtime an, weisen es den Räumen Internet und Dachbode zu; legen die Darstellung des Wertes fest und legen noch ein Log File fest, welches dem Raum Internet zugewiesen wird.
Damit das Script alle 5 Minuten gestarte wird, lege ich es crontab Eintrag fest. Dazu nutzte ich “sudo crontab -e” um die Crontab des root users zu erweitern. Folgende Zeile startet das Script dann alle 5 Minuten:
#catch ping times to google dns and update fhem */5 * * * * /opt/fhem/FHEM/pingtime.pl >/dev/null 2>&1
Der Aufruf als root ist wichtig, weil das Script sonst nicht funktioniert. Wie man oben sieht, wurde das Script als “pingtime.pl” im Verzeichnis /opt/fhem/FHEM gespeichert und ist mit “sudo chmod a+x pingtime.pl” als ausführbar gekennzeichnet.